#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <time.h> #include <unistd.h> #include "read2ch.h" #define CGINAME "read.cgi" #define CGIVER "read.cgi ver11 (2001/8/26)" #define RES_YELLOW 900 #define RES_REDZONE 950 #define RES_RED 1000 #define RES_IMODE 10 #define RES_NORMAL 100 #define MAX_FILESIZE (8192 * 64) #define SIZE_BUF 0xa000 #define LIMIT_PM 23 #define LIMIT_AM 3 char *zz_remote_addr ; char *zz_remote_host ; char *zz_http_referer ; char *zz_http_cookie ; char *zz_query_string ; char *zz_temp ; char *zz_http_user_agent ; char *zz_http_language ; #ifdef GZIP char *zz_http_encoding ; int gzip_flag; #endif #ifdef LASTMOD char *zz_http_if_modified_since ; time_t zz_fileLastmod; char lastmod_str[1024]; #endif char zz_bs[1024] ; char zz_ky[1024] ; char zz_ls[1024] ; char zz_st[1024] ; char zz_to[1024] ; char zz_nf[1024] ; char zz_im[1024] ; int nn_st,nn_to,nn_ls ; char *BigBuffer = NULL ; char *BigLine[RES_RED+16] ; char *KARA = "" ; int zz_fileSize = 0 ; int lineMax = -1 ; int out_resN = 0 ; time_t t_now ; struct tm *tm_now ; long currentTime ; char *LastChar(char *src,char *c) ; char *findSplitter(char *stt,int sp) ; char *zz_GetString(char *dst,char *tgt) ; char *doReplace(char *des,char *str0,char *str1); /****************************************************************/ /* BadAccess */ /****************************************************************/ int BadAccess() { if(strstr(zz_http_user_agent,"DreamPassport")) return 0; if(strstr(zz_http_user_agent,"DoCoMo")) return 0; if(strstr(zz_http_user_agent,"J-PHONE")) return 0; if(strstr(zz_http_user_agent,"ASTEL")) return 0; if(strstr(zz_http_user_agent,"[ja]")) return 0; if(strstr(zz_http_user_agent,"iCab")) return 0; /* MAC */ if(strstr(zz_http_user_agent,"iBOX")) return 0; /* MAC */ if(strstr(zz_http_user_agent,"WannaBe")) return 0; /* MAC */ if(strstr(zz_http_user_agent,"Macintosh; I;")) return 0; /* MAC */ if(strstr(zz_http_user_agent,"Mozilla/3.0N")) return 0; /* small? */ if(strstr(zz_http_user_agent,"CBBoard")) return 0; /* small? */ if(strstr(zz_http_user_agent,"PersonaWare")) return 0; /* small? */ if(strstr(zz_http_user_agent,"Sharp")) return 0; /* small? */ if(strstr(zz_http_user_agent,"95")) return 0; /* win95 */ if(strstr(zz_http_user_agent,"NT 4.0")) return 0; /* winNT */ if(strstr(zz_http_user_agent,"WinNT")) return 0; /* winNT */ if(!*zz_http_user_agent && !*zz_http_language) return 1; /* if(!*zz_http_user_agent) return 1;*/ #ifdef Katjusha_Beta_kisei if(strstr(zz_http_user_agent,"Katjusha")) return 1; #endif if(strstr(zz_http_user_agent,"WebFetch")) return 1; if(strstr(zz_http_user_agent,"origin")) return 1; if(strstr(zz_http_user_agent,"Nozilla")) return 1; if(strstr(zz_http_user_agent,"WWWD")) return 1; /* if(!*zz_http_language) return 1;*/ return 0; } /****************************************************************/ /* Log Out */ /****************************************************************/ int logOut(char *txt) { FILE *fp ; #ifdef DEBUG return 1; #endif if(!BadAccess()) return 1; #ifdef LOGLOGOUT /* if(strcmp(zz_bs,"ascii")) return 1; */ fp = fopen("./logout.txt","a+") ; if(fp == NULL) return ; fprintf(fp,"%02d:%02d:%02d %8s:",tm_now->tm_hour,tm_now->tm_min,tm_now->tm_sec,zz_bs) ; fprintf(fp,"(%15s)",zz_remote_addr) ; fprintf(fp,"%s***%s\n",zz_http_language,zz_http_user_agent) ; /* fprintf(fp,"%s\n",zz_query_string) ; if(strstr(zz_http_user_agent,"compatible")) fprintf(fp,"%s\n",zz_http_language) ; else fprintf(fp,"%s***%s\n",zz_http_language,zz_http_user_agent) ; if(*zz_http_referer) fprintf(fp,"%s\n",zz_http_referer) ; else fprintf(fp,"%s***%s\n",zz_http_language,zz_http_user_agent) ; else fprintf(fp,"%s\n",zz_http_user_agent) ; */ fclose(fp) ; #endif html_error("なんか不調です。") ; return 1 ; } /****************************************************************/ /* HTML BANNER */ /****************************************************************/ int html_bannerNew() { printf("<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=1 WIDTH=100%%><TR><TD>\n") ; /**/ printf("<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%%>\n") ; printf("<TR><TD HEIGHT=1 BGCOLOR=#eeeeee><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>\n") ; printf("<TR BGCOLOR=#cccccc><TD HEIGHT=20 NOWRAP><FONT SIZE=2> \n") ; printf("| <A HREF=\"http://www.maido3.com/\" CLASS=\"BigLine\"> おすすめ </A>\n") ; printf("| <A HREF=\"http://news.kakiko.com/2chwatch/\" CLASS=\"BigLine\"> 2chサーバ監視所 </A>\n") ; printf("| <A HREF=\"http://www.binboserver.com/\" CLASS=\"BigLine\"> BinboServer </A>\n") ; printf("| <A HREF=\"http://www.maido3.com/server/subdomain.html\" CLASS=\"BigLine\"> Hikky.Zansu.com </A>\n") ; printf("| <A HREF=\"http://news.kakiko.com/\" CLASS=\"BigLine\"> 無料サービス </A>\n") ; printf("|</FONT></TD></TR>\n") ; printf("<TR><TD HEIGHT=1 BGCOLOR=#333333><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>\n") ; printf("<TR><TD HEIGHT=1 BGCOLOR=#eeeeee><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>\n") ; printf("<TR><TD HEIGHT=1 BGCOLOR=#333333><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>\n") ; printf("</TABLE>\n") ; /**/ printf("<CENTER>\n") ; printf("<BR>\n") ; printf("さぶドメインシリーズ登場<BR>\n") ; printf(" *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>syo-ten</FONT></B>.com<BR>\n") ; printf(" *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>gasuki</FONT></B>.com<BR>\n") ; printf(" *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>zansu</FONT></B>.com<BR>\n") ; printf("おすきな名前を無料で使えます。早い者勝ち。<BR>\n") ; printf("<FONT COLOR=DEEPPINK><B>工夫しだいで、楽しさ100倍。</B></FONT>\n") ; printf("<P><A HREF=\"http://www.maido3.com/server/\">") ; printf("深夜でも快適なレンタルサーバサービス(n)") ; printf("</A>\n") ; printf("<BR>あの巨大なサイトも使っています。\n") ; printf("</CENTER><P>\n") ; printf("</TD></TR></TABLE><P>\n") ; } #ifdef CM_BBSPINK /****************************************************************/ /* HTML BANNER */ /****************************************************************/ int html_banner() { printf("<CENTER>\n") ; printf("<A TARGET=\"_blank\" HREF=\"http://www.pinknavi.com/?pinkid=PB0001&prg=3&act=0&txt=おいでませ&url=http://www.seiai.com/\">おいでませアダルトサイト</A><br>\n") ; printf("<br><a href=\"http://www.maido3.com/mentai/\"><b><font size=4>深夜でも快適なレンタルサーバサービス</font></b></a><br>\n") ; printf("</CENTER>\n") ; printf("<P>\n") ; } #else /****************************************************************/ /* HTML BANNER */ /****************************************************************/ int html_banner() { printf("<CENTER>\n") ; printf("<A HREF=\"http://www.maido3.com/server/\" TARGET=\"_blank\">") ; printf("深夜でも快適なレンタルサーバサービス") ; printf("</A>\n") ; printf("<BR>あの巨大なサイトも使っています。\n") ; printf("</CENTER><P>\n") ; } #endif /****************************************************************/ /* Get file size */ /****************************************************************/ int out_html1() { char *s[20] ; char r0[SIZE_BUF],r1[SIZE_BUF],r2[SIZE_BUF],r3[SIZE_BUF],r4[SIZE_BUF] ; char p[SIZE_BUF] ; if(out_resN) return 0 ; strncpy(p,BigLine[0],1024) ; p[1024 -1] = '\0'; if(!*p) return 1 ; res_split(s,p) ; #ifdef TYPE_TERI /*someReplace(s[4],r4,"@`",",") ;*/ html_head(s[4],lineMax) ; #else someReplace(s[4],r4,"@`",",") ; html_head(r4,lineMax) ; #endif if(strcmp(zz_im,"true")) /* no imode */ { printf("<DL>") ; } out_resN ++ ; return 0 ; } int out_html(int line,int lineNo) { char *s[20] ; #ifdef TYPE_TERI char *r0,*r1,*r2,*r3,*r4 ; #else char r0[SIZE_BUF],r1[SIZE_BUF],r2[SIZE_BUF],r3[SIZE_BUF],r4[SIZE_BUF] ; #endif char p[SIZE_BUF] ; /*printf("line=%d[%s]<P>\n",line,BigLine[line]);return 0;*/ if(!out_resN) /* Can I write header ? */ { strncpy(p,BigLine[0],1024) ; p[1024 -1] = '\0'; if(!*p) return 1 ; res_split(s,p) ; #ifdef TYPE_TERI r4 = s[4] ; #else someReplace(s[4],r4,"@`",",") ; #endif html_head(r4,lineMax) ; if(strcmp(zz_im,"true")) /* no imode */ { printf("<DL>") ; } } out_resN ++ ; strncpy(p,BigLine[line],1024) ; p[1024 -1] = '\0'; if(!*p) return 1 ; res_split(s,p) ; #ifdef TYPE_TERI r0 = s[0] ; r1 = s[1] ; r3 = s[3] ; #else someReplace(s[0],r0,"@`" , ",") ; someReplace(s[1],r1,"@`" , ",") ; someReplace(s[3],r3,"@`" , ",") ; someReplace(r3,r3,"&" , "&") ; #endif hlinkReplace(r3) ; if(strcmp(zz_im,"true")) /* no imode */ { if(*r3 && strlen(r3) < 8192) { printf("<dt>") ; printf("%d",lineNo) ; printf(" 名前:") ; if(*r1) {printf("<a href=\"mailto:%s \">",r1) ;} else {printf("<font color=green>") ;} printf("<b>%s </b>",r0) ; if(*r1) {printf("</a>") ;} else {printf("</font>") ;} printf(" 投稿日:%s",s[2]) ; printf("<dd>") ; printf("%s",r3) ; printf("<br><br>") ; } else { printf("<dt>") ; printf("%d",lineNo) ; printf(" 名前:<font color=green><b>"); printf("%s","") ; printf("</b></font>") ; printf(" 投稿日:[ここ壊れています]") ; printf("<DD>") ; printf("[ここ壊れています]") ; printf("<br><br>") ; } if(IsBusy2ch() && out_resN > RES_NORMAL) { printf(" <a href=\"./%s?bbs=%s&key=%s&st=%d&to=%d\">次の %d レスを見る</a>\n", CGINAME,zz_bs,zz_ky,lineNo,lineNo+RES_NORMAL,RES_NORMAL) ; printf(" <a href=\"./%s?bbs=%s&key=%s&ls=%d\">最新レス %d</a>\n", CGINAME,zz_bs,zz_ky,RES_NORMAL,RES_NORMAL) ; printf(" (%02d:00PM - %02d:00AM の間一気に全部は読めません)<BR>\n",LIMIT_PM-12,LIMIT_AM) ; return 1 ; } } else /* imode */ { if(*r3) { printf("<p>[%d:",lineNo) ; if(*s[1]) {printf("<a href=\"mailto:%s \">",r1) ;} printf("<b>%s </b>",r0) ; if(*s[1]) {printf("</a>") ;} printf("(%s)]",s[2]) ; printf("<br>%s</p>",r3) ; printf("<hr>\n") ; } else { printf("<p>[%d:",lineNo) ; printf("ここ壊れています]</p>") ; printf("<hr>\n") ; } if(out_resN > RES_IMODE) { printf(" <a href=\"./%s?bbs=%s&key=%s&st=%d&to=%d&imode=true\">次の %d レスを見る</a>\n", CGINAME,zz_bs,zz_ky,lineNo,lineNo+RES_IMODE,RES_IMODE) ; printf(" <a href=\"./%s?bbs=%s&key=%s&ls=%d&imode=true\">最新レス %d</a><BR>\n", CGINAME,zz_bs,zz_ky,RES_IMODE,RES_IMODE) ; return 1 ; } } return 0 ; } /****************************************************************/ /* Get file size */ /****************************************************************/ int dat_out() { int line,lineNo ; for(line=0;line<lineMax;line++) { lineNo = line + 1 ; if(lineNo == 1) { if(!strcmp(zz_nf,"true")) continue ; } else { if(nn_st && lineNo < nn_st) continue ; if(nn_to && lineNo > nn_to) continue ; if(nn_ls && line < lineMax - nn_ls) continue ; } if(out_html(line,lineNo)) break ; } out_html1() ; html_foot(lineMax) ; return 0 ; } /****************************************************************/ /* Get file size */ /****************************************************************/ int dat_read() { int i ; FILE *fp ; char fname[1024] ; sprintf(fname,"../%.256s/dat/%.256s.dat",zz_bs,zz_ky); //sprintf(fname,"../%s/dat/%s.dat",zz_bs,zz_ky) ; #ifdef DEBUG sprintf(fname,"998695422.dat") ; #endif zz_fileSize = getFileSize(fname) ; if(zz_fileSize > MAX_FILESIZE) html_error("このスレッド大きすぎます。") ; if(*zz_ky == '.') html_error("そんな板orスレッドないです。") ; nn_st = atoi(zz_st) ; nn_to = atoi(zz_to) ; nn_ls = atoi(zz_ls) ; if(nn_st < 0) nn_st = 0 ; if(nn_to < 0) nn_to = 0 ; if(nn_st == 1 && nn_to ==1) strcpy(zz_nf,KARA) ; if(!strcmp(zz_im,"true")) /* imode */ { if(!nn_st && !nn_to && !nn_ls) nn_ls = RES_IMODE ; } if(strcmp(zz_nf,"true")) nn_ls -- ; if(nn_ls < 0) nn_ls = 0 ; BigBuffer = malloc(zz_fileSize + 32) ; if(!BigBuffer) html_error("メモリの確保に失敗しました。") ; fp = fopen(fname,"r") ; if(!fp) { html_error("そんな板orスレッドないです。") ; return 0 ; } fread(BigBuffer,zz_fileSize,1,fp) ; fclose(fp) ; BigBuffer[zz_fileSize] = '\0' ; for(i=0;i<zz_fileSize;i++) { if(BigBuffer[i] == '\0') BigBuffer[i] = '*' ; } lineMax = getLineMax() ; /* html_error("調整中。。。") ; */ return 0; } /****************************************************************/ /* Get line number */ /****************************************************************/ int getLineMax() { int line = 0 ; char *p = BigBuffer ; char *p1 ; char b[SIZE_BUF] ; if(!p) return -8 ; while(p1 = strchr(p,'\n')) { BigLine[line] = p ; *p1 = '\0' ; p = p1 ; if(line > RES_RED) break ; line ++ ; p++ ; } return line ; } /****************************************************************/ /* Get file size */ /****************************************************************/ int getFileSize(char *file) { struct stat CountStat ; int ccc = 0 ; if(!stat(file,&CountStat)) ccc = (int)CountStat.st_size; return ccc ; } /****************************************************************/ /* Get file last-modified */ /****************************************************************/ #ifdef LASTMOD time_t getFileLastmod(char *file) { struct stat CountStat ; #ifdef FreeBSD struct timespec ccc; if(!stat(file,&CountStat)) ccc = CountStat.st_mtimespec; return ccc.tv_sec; #else time_t ccc; if(!stat(file,&CountStat)) ccc = CountStat.st_mtime; return ccc; #endif } int get_lastmod_str(time_t lastmod){ strftime(lastmod_str, 1024, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&lastmod)); return(1); } #endif /****************************************************************/ /* GET Env */ /****************************************************************/ int zz_GetEnv(void) { currentTime = (long)time(&t_now); time(&t_now) ; t_now += 9*60*60 ; tm_now = gmtime(&t_now) ; zz_remote_addr = getenv("REMOTE_ADDR") ; zz_remote_host = getenv("REMOTE_HOST") ; zz_http_referer = getenv("HTTP_REFERER") ; zz_http_cookie = getenv("HTTP_COOKIE") ; zz_query_string = getenv("QUERY_STRING") ; zz_temp = getenv("REMOTE_USER") ; zz_http_user_agent = getenv("HTTP_USER_AGENT") ; zz_http_language = getenv("HTTP_ACCEPT_LANGUAGE"); #ifdef GZIP zz_http_encoding = getenv("HTTP_ACCEPT_ENCODING"); #endif #ifdef LASTMOD zz_http_if_modified_since = getenv("HTTP_IF_MODIFIED_SINCE"); #endif if(!zz_remote_addr) zz_remote_addr = KARA ; if(!zz_remote_host) zz_remote_host = KARA ; if(!zz_http_referer) zz_http_referer = KARA ; if(!zz_query_string) zz_query_string = KARA ; if(!zz_temp) zz_temp = KARA ; if(!zz_http_user_agent) zz_http_user_agent= KARA ; if(!zz_http_language) zz_http_language = KARA ; zz_GetString(zz_bs ,"bbs") ; zz_GetString(zz_ky ,"key") ; zz_GetString(zz_ls ,"ls") ; zz_GetString(zz_st ,"st") ; zz_GetString(zz_to ,"to") ; zz_GetString(zz_nf ,"nofirst") ; zz_GetString(zz_im ,"imode") ; } /****************************************************************/ /* MAIN */ /****************************************************************/ main() { #ifdef GZIP int pid; int pipefds[2]; int whitespace = 2048; #endif char fname[1024] ; zz_GetEnv() ; printf("Content-type: text/html\n") ; #ifdef LASTMOD sprintf(fname,"../%.256s/dat/%.256s.dat",zz_bs,zz_ky); #ifdef DEBUG sprintf(fname,"998695422.dat") ; #endif zz_fileLastmod = getFileLastmod(fname) ; get_lastmod_str(zz_fileLastmod); if(zz_http_if_modified_since && strstr(zz_http_if_modified_since, lastmod_str)){ printf("Status: 304\n") ; printf("\n") ; return(0); } #endif #ifdef GZIP if(zz_http_encoding && strstr(zz_http_encoding,"gzip")){ gzip_flag = 1; }else{ gzip_flag = 0; } if(gzip_flag){ printf("Content-Encoding: gzip\n"); } #endif #ifdef DEBUG sprintf(fname,"998695422.dat") ; #endif zz_fileSize = getFileSize(fname) ; // Get Last-Modified Date #ifdef LASTMOD printf("Last-Modified: %.256s\n", lastmod_str); #endif printf("\n") ; #ifdef DEBUG sleep(1); #endif fflush(stdout); #ifdef GZIP if(gzip_flag) { pipe(pipefds); if((pid=fork()) == 0){ //child dup2(pipefds[0], 0); close(pipefds[0]); close(pipefds[1]); execl("/bin/gzip", "gzip", "-cf", NULL); printf ("Error can't exec\n"); exit(1); } //parent dup2(pipefds[1], 1); close(pipefds[0]); close(pipefds[1]); //put 2048byte fflush(stdout); while(whitespace--)putchar(' '); fflush(stdout); } #endif logOut("") ; dat_read() ; dat_out() ; if(BigBuffer) free(BigBuffer) ; BigBuffer = NULL ; #ifdef GZIP if(gzip_flag) { fflush(stdout); close(1); waitpid(pid, NULL, 0); } #endif } /****************************************************************/ /* ERROR END */ /****************************************************************/ int html_error(char *mes) { char zz_soko[256] ; char tmp[256] ; char doko[256] ; struct stat CountStat ; char comcom[256] ; *tmp = '\0' ; strcpy(tmp,LastChar(zz_ky,"/")) ; strncpy(zz_soko,tmp,3) ; *comcom = '\0' ; if(strstr(mes,"不調")) { sprintf(comcom,"<A HREF=\"http://green.jbbs.net/computer/20/bigserver.html\">お問い合わせ先</A>"); } printf("<HTML><HEAD>") ; printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">") ; printf("<TITLE>%s</TITLE>",mes) ; printf("<style type=\"text/css\">\n") ; printf("<!--\n") ; printf("TD.Type1 {\n") ; printf("color: #ffffff;\n") ; printf("text-align: left;\n") ; printf("}\n") ; printf("A.BigLine {\n") ; printf("color: #000000;\n") ; printf("text-decoration: none;\n") ; printf("}\n") ; printf("-->\n") ; printf("</style>\n") ; printf("</HEAD>\n") ; /*printf("<BASE TARGET=\"_blank\">\n") ;*/ printf("<BODY TEXT=\"#000000\" BGCOLOR=\"#EFEFEF\" link=\"#0000FF\" alink=\"#FF0000\" vlink=\"#660099\">\n") ; printf("<P><FONT SIZE=+1 COLOR=\"#FF0000\">%s</FONT></B><BR>\n",mes) ; printf("<DL>") ; printf("<dt>1 名前:<font color=green><b>%s</b></font>投稿日:2001/04/12(木) 15:11<dd>%s<br><br>%s<br>\n",CGIVER,mes,comcom) ; if(strstr(zz_http_user_agent,"Katjusha")) { printf("<dt>2 名前:<font color=green><b>%s</b></font>投稿日:2001/04/12(木) 15:11<dd>",CGIVER) ; /*printf("%s",zz_http_user_agent) ;*/ printf("<BR>") ; printf("<P><A target=\"_blank\" HREF=\"http://www.maido3.com/server/\">") ; printf("http://www.maido3.com/server/") ; printf("</A><BR>") ; printf("さぶドメインシリーズ登場<BR>") ; printf(" *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>syo-ten</FONT></B>.com<BR>") ; printf(" *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>gasuki</FONT></B>.com<BR>") ; printf(" *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>zansu</FONT></B>.com<BR>") ; printf("おすきな名前を無料で使えます。早い者勝ち。<BR>") ; printf("<FONT COLOR=DEEPPINK><B>工夫しだいで、楽しさ100倍。</B></FONT>") ; printf("<P><A target=\"_blank\" HREF=\"http://www.maido3.com/server/\">") ; printf("深夜でも快適なレンタルサーバサービス") ; printf("</A>") ; printf("<BR>あの巨大なサイトも使っています。<BR><BR>") ; printf("<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%%>") ; printf("<TR><TD HEIGHT=1 BGCOLOR=#eeeeee><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>") ; printf("<TR BGCOLOR=#cccccc><TD HEIGHT=20 NOWRAP><FONT SIZE=2> ") ; printf("| <A target=\"_blank\" HREF=\"http://www.maido3.com/\" CLASS=\"BigLine\"> おすすめ </A>") ; printf("| <A target=\"_blank\" HREF=\"http://news.kakiko.com/2chwatch/\" CLASS=\"BigLine\"> 2chサーバ監視所 </A>") ; printf("| <A target=\"_blank\" HREF=\"http://www.binboserver.com/\" CLASS=\"BigLine\"> BinboServer </A>") ; printf("| <A target=\"_blank\" HREF=\"http://www.maido3.com/server/subdomain.html\" CLASS=\"BigLine\"> Hikky.Zansu.com </A>") ; printf("| <A target=\"_blank\" HREF=\"http://news.kakiko.com/\" CLASS=\"BigLine\"> 無料サービス </A>") ; printf("|</FONT></TD></TR>") ; printf("<TR><TD HEIGHT=1 BGCOLOR=#333333><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>") ; printf("<TR><TD HEIGHT=1 BGCOLOR=#eeeeee><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>") ; printf("<TR><TD HEIGHT=1 BGCOLOR=#333333><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>") ; printf("</TABLE>") ; printf("<br><br>\n") ; } printf("</DL>\n") ; printf("<CENTER>\n") ; printf("<BR>\n") ; html_bannerNew() ; printf("<BR>\n") ; printf("</CENTER><HR>\n") ; printf("<FONT SIZE=-2>%s</FONT><HR><P>\n",CGIVER) ; if(strstr(mes,"そんな")) { sprintf(doko,"../%.50/kako/%.50/%.50.html",zz_bs,zz_soko,tmp) ; if(!stat(doko,&CountStat)) { printf("隊長! 過去ログ倉庫で、<A HREF=\"/%s/kako/%s/%s.html\">スレッド %s.html</A> を発見しました。\n",zz_bs,zz_soko,tmp,tmp); } else { sprintf(doko,"../%.50s/kako/%.50s/%.50s.dat",zz_bs,zz_soko,tmp) ; if(!stat(doko,&CountStat)) { printf("隊長! 過去ログ倉庫で、<A HREF=\"/%s/kako/%s/%s.dat\">スレッド %s.dat</A> を発見しました。<BR><B><FONT SIZE=+1 COLOR=RED>が</FONT></B>、しかしまだ html化されていません。残念、待つしかない。\n",zz_bs,zz_soko,tmp,tmp); } else { printf("<A HREF=\"/%s/kako/\">過去ログ倉庫</A>にもありませんでした。<BR>問い合わせても見つかる可能\性はほとんどありません。\n",zz_bs); } } } printf("</BODY>\n") ; printf("</HTML>\n") ; if(BigBuffer) free(BigBuffer) ; BigBuffer = NULL ; exit(0) ; } int html_error999(char *mes) { char zz_soko[256] ; char tmp[256] ; *tmp = '\0' ; strcpy(tmp,LastChar(zz_ky,"/")) ; strncpy(zz_soko,tmp,3) ; printf("<HTML><HEAD>") ; printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">") ; printf("<TITLE>ERROR</TITLE>") ; printf("</HEAD>\n") ; printf("<BODY TEXT=\"#000000\" BGCOLOR=\"#EFEFEF\" link=\"#0000FF\" alink=\"#FF0000\" vlink=\"#660099\">\n") ; printf("\n") ; printf("<TABLE border=1 cellspacing=11 cellpadding=2 width=95% bgcolor=\"#EFEFEF\" align=center><TR><TD>\n"); printf("えらー、%s<P>\n",mes) ; printf("bbs = [%s] \n",zz_bs) ; printf("key = [%s] \n",zz_ky) ; printf("ls = [%s] \n",zz_ls) ; printf("st = [%s] \n",zz_st) ; printf("to = [%s] \n",zz_to) ; printf("nofirst = [%s]<BR>\n",zz_nf) ; printf("fileSize = [%d bytes] %dlines<BR>\n",zz_fileSize,lineMax) ; printf("time=[%02d:%02d:%02d]<BR>\n",tm_now->tm_hour,tm_now->tm_min,tm_now->tm_sec); printf("<BR>「えらー、そんな板orスレッドないです」の場合はここ倉庫へ Go <BR>") ; printf("<A HREF=\"/%s/kako/%s/%s.html\">過去ログ倉庫 %s.html</A>\n",zz_bs,zz_soko,tmp,tmp); printf("<BR>まだ、dat -> html 変換が行われていない場合が良くあります。\n"); printf("<BR><A HREF=\"http://teri.2ch.net/test/read.cgi?bbs=accuse&key=980507715&ls=30\">ここ</A>で訴えると、過去ログ整理をしてくれる場合があるかもです。\n"); printf("</TD></TR></TABLE>\n") ; printf("<BR><BR><BR>\n") ; html_banner() ; printf("<BR><BR><BR>\n") ; printf("<FONT SIZE=-2>%s</FONT>\n",CGIVER) ; printf("</BODY>\n") ; printf("</HTML>\n") ; if(BigBuffer) free(BigBuffer) ; BigBuffer = NULL ; exit(0) ; } /****************************************************************/ /* */ /****************************************************************/ char *zz_GetString(char *dst,char *tgt) { int i ; int ch = (int)'&' ; char *kk0 ; char *kk1 ; char *kk = zz_query_string ; for(i=0;i<200;i++) { if(!strncmp(kk,tgt,strlen(tgt))) { kk0 = kk ; kk1 = strchr(kk,ch) ; if(kk1) *kk1 = '\0' ; strncpy(dst,kk0 + strlen(tgt) + 1,1024) ; dst[1024 -1] = '\0'; if(kk1) *kk1 = ch ; return dst ; } kk = strchr(kk,ch) ; if(!kk) break ; kk ++ ; } *dst = '\0' ; return dst ; } int whatKanji(unsigned char *str) { int val = 0; unsigned char b1, b2, b3; b1 = *str++; b2 = *str++; b3 = *str; if (b1 == 0x1b) { if (b2 == '$' && b3 == 'B') return 16; if (b2 == '$' && b3 == '@') return 32; if (b2 == '(' && b3 == 'J') return 64; if (b2 == '(' && b3 == 'B') return 128; return 0; } if ( b1 >= 0xa0 && b1 <= 0xdf) val |= 1; if ((b1 >= 0x81 && b1 <= 0x9f || b1 >= 0xe0 && b1 <= 0xfc) && (b2 >= 0x40 && b2 <= 0xfc && b2 != 0x7f)) val |= 2; if (b1 == 0x8e && (b2 >= 0xa0 && b2 <= 0xdf)) val |= 4; if ((b1 >= 0xa1 && b1 <= 0xfe) && (b2 >= 0xa1 && b1 <= 0xfe)) val |= 8; return val; } #ifdef TYPE_TERI char *findSplitter(char *stt,int sp) { unsigned char *p = (unsigned char*)stt ; char ss = (unsigned char)(sp & 0x00ff) ; while(*p) { /* if( *p >= 0xa0 && *p <= 0xdf) {p++ ;continue;} if((*p >= 0x81 && *p <= 0x9f || *p >= 0xe0 && *p <= 0xfc)) {p += 2 ;continue;} */ if(*p == ss && *(p+1) == '>') return p ; p++ ; } return NULL ; } #else char *findSplitter(char *stt,int sp) { unsigned char *p = (unsigned char*)stt ; char ss = (unsigned char)(sp & 0x00ff) ; while(*p) { if( *p >= 0xa0 && *p <= 0xdf) {p++ ;continue;} if((*p >= 0x81 && *p <= 0x9f || *p >= 0xe0 && *p <= 0xfc)) {p += 2 ;continue;} /* if((*p >= 0x40 && *p <= 0xfc && *p != 0x7f)) p += 2 ;*/ if(*p == ss) return p ; p++ ; } return NULL ; } #endif int res_split(char **s,char *p) { int i ; char *p0 ; for(i=0;i<5;i++) s[i] = KARA ; s[0] = p ; for(i=1;i<5;i++) { #ifdef TYPE_TERI p0 = findSplitter(s[i-1],'<') ; if(!p0) {return 0;} *p0 = '\0' ; p0++ ; *p0 = '\0' ; p0++ ; s[i] = p0 ; #else p0 = findSplitter(s[i-1],',') ; if(!p0) {return 0;} *p0 = '\0' ; p0++ ; s[i] = p0 ; #endif } return 1 ; } int dump_out16(char *d) { unsigned char *p = (unsigned char*)d ; printf("\n\n<!-- ") ; while(*p) { printf(",%02x",*p) ; p++ ; } printf(" -->\n\n") ; } int IsBusy2ch() { if(tm_now->tm_hour < LIMIT_AM || LIMIT_PM <= tm_now->tm_hour) return 1 ; return 0 ; } /****************************************************************/ /* えらー */ /****************************************************************/ char *LastChar(char *src,char *c) { char *p ; if(!*src) return(src) ; p = strstr(src,c) ; if(!p) return(src) ; return LastChar(p+1,c) ; /* return p+1 ; */ } /****************************************************************/ /* HTML HEADER */ /****************************************************************/ int html_head(char *title,int line) { printf("<HTML>") ; printf("<HEAD>") ; printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">") ; printf("<TITLE>%s </TITLE>",title) ; if(strcmp(zz_im,"true")) /* no imode */ { printf("<SCRIPT LANGUAGE=JavaScript>") ; printf("<!--\n") ; printf("N=g(\"NAME\");") ; printf("M=g(\"MAIL\");") ; printf("function g(key,tmp1,tmp2,xx1,xx2,xx3){") ; printf("tmp1=\" \"+document.cookie+\";\";") ; printf("xx1=xx2=0;") ; printf("len=tmp1.length;") ; printf("while(xx1<len){") ; printf("xx2=tmp1.indexOf(\";\",xx1);") ; printf("tmp2=tmp1.substring(xx1+1,xx2);") ; printf("xx3=tmp2.indexOf(\"=\");") ; printf("if(tmp2.substring(0,xx3)==key){") ; printf("return(unescape(tmp2.substring(xx3+1,xx2-xx1-1)));") ; printf("}") ; printf("xx1=xx2+1;") ; printf("}return(\"\");") ; printf("}\n") ; printf("// -->") ; printf("</SCRIPT>") ; } printf("</HEAD>") ; printf("<BODY TEXT=black BGCOLOR=#EFEFEF link=blue alink=red vlink=#660099>") ; if(strcmp(zz_im,"true")) /* no imode */ { printf("<A HREF=\"/%s/index2.html\">■掲示板に戻る■</A>",zz_bs) ; printf(" <A HREF=\"%s?bbs=%s&key=%s\">レスを全部読む</A>",CGINAME,zz_bs,zz_ky) ; printf(" <A HREF=\"%s?bbs=%s&key=%s&ls=100\">最新レス100</A>",CGINAME,zz_bs,zz_ky) ; } else { printf("<A HREF=\"/%s/i/\">■掲示板に戻る■</A>",zz_bs) ; printf(" <A HREF=\"%s?bbs=%s&key=%s&st=1&st=%d&imode=true\">レスを最初から読む</A>",CGINAME,zz_bs,zz_ky,RES_IMODE) ; printf(" <A HREF=\"%s?bbs=%s&key=%s&ls=%d&imode=true\">最新レス%d</A>",CGINAME,zz_bs,zz_ky,RES_IMODE,RES_IMODE) ; } if(line > RES_RED) { printf("<P><TABLE><TR><TD BGCOLOR=RED>\n") ; printf("<FONT COLOR=WHITE><BR><BR>レス数が %d を超えています。残念ながら全部は表\示しません。<BR><BR></FONT>\n",RES_RED,RES_RED) ; printf("</TD></TR></TABLE>\n") ; } else if(line > RES_REDZONE) { printf("<P><TABLE><TR><TD BGCOLOR=RED>\n") ; printf("<FONT COLOR=WHITE>レス数が %d を超えています。%dを超えると表\示できなくなるよ。</FONT>\n",RES_REDZONE,RES_RED) ; printf("</TD></TR></TABLE>\n") ; } else if(line > RES_YELLOW) { printf("<P><TABLE><TR><TD BGCOLOR=YELLOW>\n") ; printf("レス数が %d を超えています。%dを超えると表\示できなくなるよ。\n",RES_YELLOW,RES_RED) ; printf("</TD></TR></TABLE>\n") ; } printf("<P><FONT SIZE=+1 COLOR=red>%s </FONT>",title) ; } /****************************************************************/ /* HTML FOOTER */ /****************************************************************/ int html_foot(int line) { if(!strcmp(zz_im,"true")) return html_foot_im() ; if(line <= RES_RED) { printf("<form method=POST action=\"bbs.cgi\">") ; /**/ printf("<input type=submit value=\"書き込む\" name=submit> 名前: ") ; printf("<SCRIPT Language=JavaScript>") ; printf("<!--\n") ; printf("document.write(\"<INPUT TYPE=text NAME=FROM SIZE=19 VALUE=\",N,\"> E-mail<font size=1> (省略可) </font>: <INPUT TYPE=text NAME=mail SIZE=19 VALUE=\",M,\">\");\n") ; printf("// -->") ; printf("</SCRIPT>") ; printf("<NOSCRIPT>") ; printf("<INPUT TYPE=text NAME=FROM SIZE=19>") ; printf(" E-mail<font size=1> (省略可) </font>: ") ; printf("<INPUT TYPE=text NAME=mail SIZE=19>") ; printf("</NOSCRIPT>\n") ; printf("<BR><textarea rows=5 cols=70 wrap=OFF name=MESSAGE></textarea>") ; printf("<input type=hidden name=bbs value=%s>",zz_bs) ; printf("<input type=hidden name=key value=%s>",zz_ky) ; printf("<input type=hidden name=time value=%ld>",currentTime) ; /**/ printf("</form>") ; } /*html_banner() ;*/ printf("</DL><P>%s</BODY></HTML>\n",CGIVER) ; } /****************************************************************/ /* HTML FOOTER */ /****************************************************************/ int html_foot_im(void) { printf("<FORM METHOD=POST ACTION=\"./bbs.cgi\">\n"); printf("<INPUT TYPE=submit VALUE=\"かきこむ\" name=\"submit\"> "); printf("NAME:<INPUT TYPE=text NAME=FROM SIZE=20 VALUE=\"\">"); printf("MAIL:<INPUT TYPE=text NAME=mail SIZE=20 VALUE=\"\">"); printf("<br>"); printf("<INPUT TYPE=hidden name=time VALUE=%ld>\n",currentTime); printf("<INPUT TYPE=hidden name=bbs VALUE=%s>\n",zz_bs); printf("<INPUT TYPE=hidden name=key VALUE=%s>\n",zz_ky); printf("<TEXTAREA ROWS=5 COLS=60 wrap=off NAME=MESSAGE></TEXTAREA>\n"); printf("</FORM><br>\n") ; /*html_banner() ;*/ printf("<P>%s</BODY></HTML>\n",CGIVER) ; } /****************************************************************/ /* Replace */ /****************************************************************/ char *doReplace(char *des,char *str0,char *str1) { char *p,*ret = NULL ; char t[SIZE_BUF] ; strcpy(t,des) ; p = strstr(t,str0) ; if(!p) return ret ; *p = '\0' ; strcpy(des,t) ; strcat(des,str1) ; ret = des + strlen(des) ; strcat(des,p+strlen(str0)) ; return ret ; } int someReplace(char *src,char *des,char *str0,char *str1) { char *last ; strcpy(des,src) ; last = des ; while(last) { last = doReplace(last,str0,str1) ; } return 1 ; } int hrefStop(char x) { if('A' <= x && x <= 'Z') return 0 ; if('a' <= x && x <= 'z') return 0 ; if('0' <= x && x <= '9') return 0 ; if(x == '#') return 0 ; if(x == '/') return 0 ; if(x == '~') return 0 ; if(x == '_') return 0 ; if(x == '.') return 0 ; if(x == ',') return 0 ; if(x == '$') return 0 ; if(x == '%') return 0 ; if(x == '&') return 0 ; if(x == '@') return 0 ; if(x == '?') return 0 ; if(x == '=') return 0 ; if(x == '-') return 0 ; if(x == '+') return 0 ; if(x == '*') return 0 ; if(x == ';') return 0 ; if(x == ':') return 0 ; if(x == '!') return 0 ; if(x == '^') return 0 ; if(x == '`') return 0 ; if(x == '|') return 0 ; if(x == '[') return 0 ; if(x == ']') return 0 ; if(x == '{') return 0 ; if(x == '}') return 0 ; if(x == '\\') return 0 ; return 1 ; } int cutWordOff(char *src,char *word) { char *p = strstr(src,word) ; if(!p) return 0 ; *p = '\0' ; return 1 ; } int ExistHlinkX(char *tgt,char *src,char *url,char *hrefStr) { char *p ; char *u ; p = strstr(src,tgt) ; if(!p) return 0 ; /*NASHI*/ for(u=url;*p;p++) { if(hrefStop(*p)) break ; *u = *p ; u++ ; } *u = '\0' ; /*-- " 等の削除 --*/ cutWordOff(url,""") ; /* cutWordOff(url,";") ;*/ /*---------------------*/ sprintf(hrefStr,"<A HREF=\"%.1024s\" TARGET=\"_blank\">%.1024s</A>",url,url) ; //sprintf(hrefStr,"<A HREF=\"%s\" TARGET=\"_blank\">%s</A>",url,url) ; return 1 ; /*ARI*/ } int ExistHlink(char *src,char *h0,char *h1) { if(ExistHlinkX("http://",src,h0,h1)) return 1; if(ExistHlinkX("ftp://",src,h0,h1)) return 1; return 0 ; } int hlinkReplace(char *src) { char *last = src ; char hlink0[SIZE_BUF] ; char hlink1[SIZE_BUF] ; while(last) { if(!ExistHlink(last,hlink0,hlink1)) break ; last = doReplace(last,hlink0,hlink1) ; } return 1 ; } /****************************************************************/ /* END OF THIS FILE */ /****************************************************************/